package org.example.pingpong.config;

import org.example.pingpong.interceptors.LoginInterceptors;
import org.example.pingpong.interceptors.PowerInterceptors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptors loginInterceptors;  // 注入自定义的登录拦截器

    @Autowired
    private PowerInterceptors powerInterceptors;  // 注入自定义的权限拦截器

    @Value("${upload.accessPath}")
    private String accessPath;  // 获取上传资源的 URL 前缀路径

    @Value("${upload.localPath}")
    private String localPath;  // 获取本地上传文件的存储路径

    /**
     * 配置拦截器，将自定义的 LoginInterceptors PowerInterceptors 注册到 Spring 容器。
     * 排除一些无需登录的路径，例如登录、注册、Swagger 文档等接口。
     *
     * @param registry 拦截器注册表
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptors)
                // 配置排除路径，不需要拦截的接口
                .excludePathPatterns("/user/login", "/user/signup",  // 登录和注册
                        "/error", "/doc.html", "/v3/**", "/swagger-resources/**", "/webjars/**", // Swagger 相关
                        "/upload/**", "/user/emailmsg/**",  // 文件上传和验证码相关接口
                        "/user/ratebyuser", "/event/detail", "/event/formerevent/list", "/event/currentevent/list", "/score/ratebyevent");

        registry.addInterceptor(powerInterceptors)
                // 配置排除路径，添加需要拦截的接口
                .addPathPatterns("/area/**", "/application/list", "/event/add", "/event/delete", "/event/edit", "/event/list", "/score/**")
                .excludePathPatterns("/score/ratebyevent");
    }

    /**
     * 配置跨域请求的相关规则。
     * 允许所有来源、所有方法、所有头信息的跨域请求。
     * 设置最大缓存时间为 3600 秒。
     *
     * @param registry 跨域配置注册表
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")  // 配置所有路径都支持跨域
                .allowedOrigins("*")  // 允许所有来源的请求
                .allowedMethods("*")  // 允许所有 HTTP 方法（GET、POST、PUT 等）
                .allowedHeaders("*")  // 允许所有请求头
                .maxAge(3600);  // 设置跨域请求的缓存时间为 3600 秒
    }

    /**
     * 配置静态资源的访问路径与本地文件存储路径的映射。
     * 假设上传的图片保存在本地路径，如 D:/upload/images/
     * 配置后，访问 /images/** 的 URL 会映射到本地 D:/upload/images/ 目录中的文件。
     *
     * @param registry 资源处理注册表
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 将文件路径前缀 accessPath 映射到本地文件夹路径 localPath
        // 假设 localPath 为 "D:/upload/images/"，accessPath 为 "/images/"
        registry.addResourceHandler(accessPath + "**")  // 配置访问 URL 前缀
                .addResourceLocations("file:" + localPath);  // 映射到本地文件存储路径
    }
}
